/**
 */
package pl.koziolekweb.translator;

import java.awt.EventQueue;
import java.io.File;
import java.util.ServiceLoader;

import pl.koziolekweb.translator.guiservices.MainFrameService;
import pl.koziolekweb.translator.utilites.Context;

/**
 * @author koziolek Info: $Id: App.java 161 2009-03-16 22:26:47Z bjkuczynski $
 */
public final class App {

	/**
	 * Gui service
	 */
	private MainFrameService<Context> mainFrameService = null;

	/**
	 * Application context
	 */
	private static Context context;

	/**
	 * @param args
	 *            arguments
	 * @throws Throwable
	 *             if something fail... then fail
	 */
	public static void main(final String[] args) throws Throwable {

		final App app = new App();
		// nie ma przebacz to musi był zsynchronizowane. Inaczej sie wypieprzy
		// jeżeli przez przypadek wcześniej wstanie servis słownika
		synchronized (App.class) {
			app.loadApplicationContext();
			app.loadGuiServices();
		}

		// GUI śmiga jak ruskie MiGi w osobnym wątku.
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					app.mainFrameService.init(App.context);
				} catch (Throwable e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Load application context.
	 */
	private void loadApplicationContext() {
		App.context = Context.getApplicationContext(new File("."));
	}

	/**
	 * Load GUI service
	 */
	private void loadGuiServices() {
		// pobiera ostatni serwis z listy... nie che mi się pisać pobierania po
		// nazwie i tyle.
		// TODO: Zrobić tu pobieranie po nazwie. Deadline wersja 0.2
		for (MainFrameService<Context> service : ServiceLoader
				.load(MainFrameService.class)) {
			if (service.getServiceName().equals(
					App.context.getParam("gui.main.service.name"))) {
				mainFrameService = service;
			}
		}
		if (mainFrameService == null) {
			throw new NullPointerException("Gui service is NULL");
		}
	}

	/**
	 */
	private App() {
	}
}
